package com.heima.file.config;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.BucketLoggingConfiguration;
import com.qcloud.cos.model.CannedAccessControlList;
import com.qcloud.cos.model.CreateBucketRequest;
import com.qcloud.cos.model.SetBucketLoggingConfigurationRequest;
import com.qcloud.cos.region.Region;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/***
 * @description Oss文件存储服务器
 * @return
 */
@Slf4j
@Configuration
@EnableConfigurationProperties({OssAliyunConfigProperties.class})
//当引入FileStorageService接口时
@ConditionalOnClass({COSClient.class})
public class OssAliyunAutoConfig {
	@Autowired
	OssAliyunConfigProperties ossAliyunConfigField;
	@Bean
//	@ConditionalOnMissingBean(OSSAliyunFileStorageService.class)
	public ClientConfig clientConfiguration() {
		// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类，可配置代理、连接超时、最大连接数等参数。
		ClientConfig conf = new ClientConfig();
		// 设置OSSClient允许打开的最大HTTP连接数，默认为1024个。
		conf.setMaxConnectionsCount(ossAliyunConfigField.getMaxConnections());
		// 设置Socket层传输数据的超时时间，默认为50000毫秒。
		conf.setSocketTimeout(ossAliyunConfigField.getSocketTimeout());
		// 设置建立连接的超时时间，默认为50000毫秒。
		conf.setConnectionTimeout(ossAliyunConfigField.getConnectionTimeout());
		// 设置从连接池中获取连接的超时时间（单位：毫秒），默认不超时。
		conf.setConnectionRequestTimeout(ossAliyunConfigField.getConnectionRequestTimeout());
		// 设置连接空闲超时时间。超时则关闭连接，默认为60000毫秒。
		conf.setIdleConnectionAlive(ossAliyunConfigField.getIdleConnectionTime());
		// 设置失败请求重试次数，默认为3次。
		conf.setMaxErrorRetry(ossAliyunConfigField.getMaxErrorRetry());
		// 设置是否开启二级域名的访问方式，默认不开启。
		conf.setIsDistinguishHost(false);
		// 设置连接OSS所使用的协议（HTTP/HTTPS），默认为HTTP。
		conf.setHttpProtocol(HttpProtocol.https);
		// 设置用户代理，指HTTP的User-Agent头，默认为aliyun-sdk-java。
		conf.setUserAgent(ossAliyunConfigField.getUserAgent());
//    	// 设置是否支持将自定义域名作为Endpoint，默认支持。
//    	conf.setSupportCname(false);
//    	// 设置代理服务器端口。
//    	conf.setProxyHost(ossAliyunConfigField.getProxyHost());
//    	// 设置代理服务器验证的用户名。
//    	conf.setProxyUsername(ossAliyunConfigField.getProxyUsername());
//    	// 设置代理服务器验证的密码。
//    	conf.setProxyPassword(ossAliyunConfigField.getProxyPassword());
		return conf;
	}

	@Bean
	@ConditionalOnBean(ClientConfig.class)
	public COSClient ossClient(){

		// 1 初始化用户身份信息（secretId, secretKey）。
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
		String secretId = ossAliyunConfigField.getAccessKeyId();//用户的 SecretId，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
		String secretKey = ossAliyunConfigField.getAccessKeySecret();//用户的 SecretKey，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
		COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
		Region region = new Region(ossAliyunConfigField.getEndpoint());
		ClientConfig clientConfig = new ClientConfig(region);
// 这里建议设置使用 https 协议
// 从 5.6.54 版本开始，默认使用了 https
		clientConfig.setHttpProtocol(HttpProtocol.https);
// 3 生成 cos 客户端。
		COSClient cosClient = new COSClient(cred, clientConfig);
		//判断容器是否存在,不存在就创建
		if (!cosClient.doesBucketExist(ossAliyunConfigField.getBucketName())) {
			cosClient.createBucket(ossAliyunConfigField.getBucketName());
			CreateBucketRequest createBucketRequest = new CreateBucketRequest(ossAliyunConfigField.getBucketName());
			//设置问公共可读
			createBucketRequest.setCannedAcl(CannedAccessControlList.PublicRead);
			cosClient.createBucket(createBucketRequest);
		}

//		//添加访问白名单
//		List<String> refererList = Arrays.asList(whiteList.split(","));
//		// 添加Referer白名单。Referer参数支持通配符星号（*）和问号（？）。
//		// 设置存储空间Referer列表。设为true表示Referer字段允许为空。
//		BucketReferer br = new BucketReferer(true, refererList);
//		ossClient.setBucketReferer(ossAliyunConfigField.getBucketName(), br);


		//添加客户端访问日志
		BucketLoggingConfiguration request = new BucketLoggingConfiguration();
		// 设置存放日志文件的存储空间。
		request.setDestinationBucketName(ossAliyunConfigField.getBucketName());
		// 设置日志文件存放的目录。
		request.setLogFilePrefix(ossAliyunConfigField.getBucketName());

		SetBucketLoggingConfigurationRequest setBucketLoggingConfigurationRequest = new SetBucketLoggingConfigurationRequest(ossAliyunConfigField.getBucketName(), request);

		cosClient.setBucketLoggingConfiguration(setBucketLoggingConfigurationRequest);

		log.info("-----------------结束创建OSSClient--------------------");
		return cosClient;
	}


}
